热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

剩余|程度_视频编解码—码控算法

篇首语:本文由编程笔记#小编为大家整理,主要介绍了视频编解码—码控算法相关的知识,希望对你有一定的参考价值。目录

篇首语:本文由编程笔记#小编为大家整理,主要介绍了视频编解码 — 码控算法相关的知识,希望对你有一定的参考价值。




目录

码控算法 

码控算法的类型

具体操作过程如下

复杂度求解

帧组级

帧级

GOM级





码控算法 

        用算法来控制编码器输出码流的大小,码控就是为一帧图像选择一个合适的QP值的过程。

一帧图像的画面确定了之后,画面的复杂度和QP值几乎决定了编码之后的大小。由于编码器无法决定画面的复杂度,因此码控的目标就是选择一个合适的QP值,以此来控制编码后码流的大小。


码控算法的类型

CBR (恒定码率) ,VBR (动态码率) ,CQP (恒定QP),CRF(恒定码率因子)

VBR 码率随着原始视频画面复杂度的变化而不断变化,复杂的时候码率比较高

CQP 使用同一个QP值,画面复杂的时候,残差比较大,画面简单的时候,残差很小,一般用来衡量编码算法的性能,在实际工程中不会使用

CRF 是x264默认的码控算法,QP是会变化。在画面运动大时候,提高QP值,画面运动小的时候,降低QP值。

CBR 恒定码率,需要用户设置一个值,不管画面复杂度如何,都尽量使得输出的码率接近设置的目标码率。适合RTC场景,因为RTC场景希望编码的码率跟实际预测的带宽值接近,不能超出码率太大,也希望能够尽量有效地利用带宽,不能太低目标码率,从而能保证编码后图像画面清晰。

CBR算法

一步步的将输出码率逼近目标码率,而不是一步准确确定QP值。

算法控制分为 帧组级,帧级,宏块组GOM


具体操作过程如下

1、先确定帧组级的输出大小尽量接近目标码率。

2、确定组内的每一帧具体应该分配多少的大小才能保证帧组最后输出的大小

3、根据目标帧大小,确定一个帧级的QP值

4、确定帧内的宏块组应该分配多少,来保证当前帧最后的输出大小能接近于目标帧大小

5、确定宏块的QP

输出码率尽量接近目标码率,保证在不同画面复杂度和不同运动程度的情况下,需要先计算得到当前帧的复杂度。


复杂度求解

I帧复杂度求解:帧内预测是用编码块周围已编码的像素来预测当前编码块的像素值,方差能够表示I帧复杂度的值,方差越大,表示帧内变化程度越剧烈,用周围像素去预测当前编码块的像素,可能有较大的残差。

I帧的复杂度,是求每一个宏块的方差,最后将帧的所有宏块的方差之和作为帧的复杂度

P帧复杂度求解: SAD值,使用当前帧的宏块,减去参考帧对应位置的宏块,并将所有宏块的SAD值加起来作为P帧的复杂度。


帧组级

CBR是恒定码率,保证一段时间内输出的码率接近目标码率,而不是每一帧输出都严格接近目标码率。因为,算法是根据一段时间内前面已经编码的结构调节未编码帧的QP值,从而达到一组帧的输出大小尽量接近目标码率的。

在开始的时候,需要根据目标码率来确定帧组的目标大小,再确定帧组内每一帧的目标大小。

1,在编码刚开始的时候,帧组的剩余大小就是帧组的目标大小

2、编码当前帧组中的第一帧。将帧组的剩余大小除以帧组的帧数,得到第一帧的目标大小

3、第一帧编码后,需要用第一帧实际编码的大小来更新帧组的剩余大小

4、将帧组的剩余大小减去第一帧编码后的实际大小

5、第二帧的目标大小就是等于更新后的帧组的大小,除以剩余帧数

6、帧组中帧不断编码,不断更新帧组的剩余大小,不断调整帧的目标大小

总体意思是,总的减去已经用的,剩下的平均分配,不断迭代


帧级

有了帧组级码控中计算得到的目标帧大小,就能计算当前帧SliceQP

当前帧的复杂度和目标帧大小,加上前面已经编码完成的帧的复杂度和编码使用的Qstep值。以及使用这个QStep编码之后实际的编码大小来计算。

可以根据前面已经编码好了的帧估算一下,大体计算一下,这些帧的复杂度和QStep跟最终的编码大小大概成多少比例,然后再使用这个比例来估算在当前帧的复杂度下,大概使用多少QStep能输出大小接近于目标帧大小。

一帧编码后的大小应该是和帧的复杂度成正比,并且跟帧使用的QStep成反比。


GOM级

在编码一个GOM之前,需要计算帧的实际剩余大小帧的目标剩余大小,帧的实际剩余大小就是用帧的目标大小减去帧中已编码的GOM的实际大小。

再使用帧的实际剩余大小加上前一个GOM的实际编码大小,减去该GOM的目标大小,就是帧的目标剩余大小。

需要计算当前GOM的目标大小,以供下一个GOM编码的时候做GOM级码控计算的时候使用。


推荐阅读
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了一个从入门到高手的VB.NET源代码,通过学习这些源代码,可以在21天内成为VB.NET高手。文章提供了下载地址,并提醒读者加入作者的QQ群和收藏作者的博客。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 本文介绍了某点评网的搜索策略,包括名称和地址的匹配策略,模糊匹配的方法以及不同口音和拼音的近似发音。同时提供了一些例子来说明这些策略的应用。 ... [详细]
author-avatar
mobiledu2502908023
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有